#include "dialogimporter.h"
#include "ui_dialogimporter.h"

DialogImporter::DialogImporter(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::DialogImporter)
{
    ui->setupUi(this);

    idConso=0;
    db = QSqlDatabase::database();

    QString chemin = QFileDialog::getOpenFileName(this,"Fichier à importer",QDir::currentPath(),"CSV (*.csv)");

    if(chemin != ""){
        QFile fichier(chemin);
        if(!fichier.open(QIODevice::ReadOnly)){
            QMessageBox::critical(this,"Ouverture","Impossible d'ouvrir ce fichier, vérifiez sa validité");
            this->reject();
        }


        QTextStream in(&fichier);
        QString premier = in.readLine();

        double prix = 0.0;



        model = new QSqlTableModel(this);
        model->setTable("Consos");
        model->select();
        model->setHeaderData(0,Qt::Horizontal,"Id");
        model->setHeaderData(1,Qt::Horizontal,"Intitule");
        model->setHeaderData(2,Qt::Horizontal,"Prix");

        ui->tableConso->setModel(model);
        ui->tableConso->hideColumn(2);
        ui->tableConso->hideColumn(3);
        ui->tableConso->hideColumn(5);
        ui->tableConso->hideColumn(6);

        if(premier.split(";")[0].toInt()==0){
            QString infoConso = in.readLine();
            QStringList infosConsos = infoConso.split(";");

            if(infosConsos[1].contains(",")){
                QString prixTemp = infosConsos[1].replace(",",".");
                prix = prixTemp.toDouble();
            }else{
                prix = infosConsos[1].toDouble();
            }

            ui->lineInfo->setText(infosConsos[0]);
            ui->spinInfo->setValue(prix);
            in.readLine();

            ui->groupConso->setVisible(false);
            ui->groupBucquage->setVisible(true);
            ui->radioTypeTemp->setChecked(true);
            ui->lineInfo->setReadOnly(false);
            ui->spinInfo->setReadOnly(false);

        }else{
            in.seek(0);

            ui->groupConso->setVisible(true);
            ui->groupBucquage->setVisible(false);
            ui->lineInfo->setReadOnly(true);
            ui->spinInfo->setReadOnly(true);


            ui->radioTypeExist->setChecked(true);

        }

        QTableWidgetItem *it0 = new QTableWidgetItem("Id");
        QTableWidgetItem *it1 = new QTableWidgetItem("Bucque");
        QTableWidgetItem *it2 = new QTableWidgetItem("Solde");
        QTableWidgetItem *it3 = new QTableWidgetItem("Qte");
        QTableWidgetItem *it4 = new QTableWidgetItem("A venir");

        ui->tableBucquage->setItem(0,0,it0);
        ui->tableBucquage->setItem(0,1,it1);
        ui->tableBucquage->setItem(0,2,it2);
        ui->tableBucquage->setItem(0,3,it3);
        ui->tableBucquage->setItem(0,4,it4);

        while(!in.atEnd()){
            int i = ui->tableBucquage->rowCount();
            ui->tableBucquage->setRowCount(i+1);

            QStringList infosPg = in.readLine().split(";");
            Pg pg(infosPg[0].toInt(),infosPg[1]);

            if(pg.getId()>0){
                QTableWidgetItem *item0 = new QTableWidgetItem(QString::number(pg.getId()));
                QTableWidgetItem *item1 = new QTableWidgetItem(pg.getBucque()+" "+QString::number(pg.getFams())+" "+pg.getProms());
                QTableWidgetItem *item2 = new QTableWidgetItem(QString::number(pg.getSolde()));
                QTableWidgetItem *item3 = new QTableWidgetItem(infosPg[2]);
                QTableWidgetItem *item4 = new QTableWidgetItem(QString::number(pg.getSolde()-double(infosPg[2].toInt()*prix)));
                ui->tableBucquage->setItem(i,0,item0);
                ui->tableBucquage->setItem(i,1,item1);
                ui->tableBucquage->setItem(i,2,item2);
                ui->tableBucquage->setItem(i,3,item3);
                ui->tableBucquage->setItem(i,4,item4);

            }else{
                QMessageBox::warning(this,"Erreur bucquage",infosPg[0] +" de la prom'ss "+ infosPg[1]+" n'est pas bucqué! Cela est due au fait qu'il n'est pas présent dans la base." );
            }

        }

    }else{
        this->destroy();
    }

}

DialogImporter::~DialogImporter()
{
    delete ui;
}

void DialogImporter::on_radioTypeTemp_clicked()
{
    ui->lineInfo->setReadOnly(false);
    ui->spinInfo->setReadOnly(false);
    idConso = 0;
    ui->groupConso->setVisible(false);
    ui->groupBucquage->setVisible(true);
}

void DialogImporter::on_radioTypeExist_clicked()
{
    ui->lineInfo->setReadOnly(true);
    ui->spinInfo->setReadOnly(true);
    ui->groupBucquage->setVisible(false);
    ui->groupConso->setVisible(true);
}

void DialogImporter::majSoldes(){
    double prix = ui->spinInfo->value();
    for(int i=1;i<ui->tableBucquage->rowCount();i++){
        ui->tableBucquage->item(i,4)->setText(QString::number(ui->tableBucquage->item(i,2)->text().toDouble()-double(ui->tableBucquage->item(i,3)->text().toInt()*prix)));
    }

}

void DialogImporter::on_lineRecherche_textEdited(const QString &arg1)
{
    if(arg1!=""){
        model->setFilter("Intitule LIKE '%"+arg1+"%'");
    }else{
        model->setFilter("");
    }
    model->select();
}

void DialogImporter::on_tableConso_clicked(const QModelIndex &index)
{
    int r = index.row();
    idConso = index.model()->index(r,0).data().toInt();
    ui->lineInfo->setText(model->index(r,1).data().toString());
    ui->spinInfo->setValue(model->index(r,4).data().toDouble());
    ui->groupConso->setVisible(false);
    ui->groupBucquage->setVisible(true);
    majSoldes();

}

void DialogImporter::on_buttonBox_accepted()
{
    QString intituleConso = ui->lineInfo->text();

    double prix = ui->spinInfo->value();



        QSqlQuery q;
    if(idConso==0){
        q.prepare("INSERT INTO Consos (Intitule,Actif,Prix,Dispo,Reserve) VALUES (:int,0,:prix,0,0)");
        q.bindValue(":int",intituleConso);
        q.bindValue(":prix",prix);
        q.exec();
        idConso = q.lastInsertId().toInt();

    }

    q.prepare("UPDATE Pg SET Solde = Solde - :prix WHERE Id = :id");

    QSqlQuery q2;
    q2.prepare("INSERT INTO Historique (Pg,Conso,Date) VALUES (:pg,:conso,NOW())");
    q2.bindValue(":conso",idConso);

    for(int i = 1; i < ui->tableBucquage->rowCount();i++){

        int idPg = ui->tableBucquage->model()->index(i,0).data().toInt();

        if(idPg>0){

            db.transaction();
            int nb = ui->tableBucquage->model()->index(i,3).data().toInt();
            q.bindValue(":id",idPg);
            q2.bindValue(":pg",idPg);
            q.bindValue(":prix",double(prix*nb));

            for(int i = 0; i< nb; i++){
                q2.exec();
            }
            q.exec();
            db.commit();

        }else{
            QMessageBox::warning(this,"Erreur bucquage",QString::number(idPg)+" n'est pas bucqué! Cela est due au fait qu'il n'est pas présent dans la base." );
        }


    }

}
